package com.leetcode.www;

import java.util.Arrays;

/**
 * Creared with IntelliJ IDEA.
 * Description:给你一个整数数组 nums，和一个整数 k 。
 *
 * 在一个操作中，您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ，其中 x 是一个范围为 [-k, k] 的整数。对于每个索引 i ，最多 只能 应用 一次 此操作。
 *
 * nums的分数是nums中最大和最小元素的差值。
 *
 * 在对 nums 中的每个索引最多应用一次上述操作后，返回nums 的最低 分数
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/smallest-range-i
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * User:yxd
 * Date:2022-04-30
 * Time:22:58
 */
public class Everyday908 {
    public int smallestRangeI(int[] nums, int k) {
        int max = nums[0], min = nums[0];
        for (int i : nums) {
            max = Math.max(max, i);//找出最大值
            min = Math.min(min, i);//找出最小值
        }
        return Math.max(0, max - min - 2 * k);
        //对于任意一个数 nums[i] 而言，其所能变化的范围为 [nums[i] - k, nums[i] + k]，我们需要最小化变化后的差值。
        // 而当 k 足够大时，我们必然能够将所有数变为同一个值，此时答案为 0，而更一般的情况，我们能够缩减的数值距离为 2 * k，因此如果原来的最大差值为 d =max−min，若 d <= 2 * k 时，答案为 0，否则答案为 d - 2 * k

    }

    public int smallestRangeI1(int[] nums, int k) {
        int minNum = Arrays.stream(nums).min().getAsInt();
        int maxNum = Arrays.stream(nums).max().getAsInt();
        return maxNum - minNum <= 2 * k ? 0 : maxNum - minNum - 2 * k;
    }
}
